/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package carreras.datos;

import carreras.entidades.CatCorredorAuto;
import carreras.entidades.CorredorAuto;
import carreras.entidades.Torneo;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Fanky10 <fanky10@gmail.com>
 */
public class DataInscripcion extends data.Data{
    public void addCorredorAuto(carreras.entidades.CorredorAuto ca, carreras.entidades.Torneo t) throws SQLException {
        String insert = "INSERT INTO inscripto (id_corredor,id_auto,id_categoria,id_torneo)"
                + " VALUES ("
                + ca.getCorredor().getId()+","
                + ca.getAuto().getId()+","
                + (ca.getCategoria().getId()<0?"null":ca.getCategoria().getId())+","
                + t.getId()+")";
        db.executeUpdate(insert);
    }
    public void updateCategoriaInscripcion(carreras.entidades.CorredorAuto ca, carreras.entidades.Torneo t) throws SQLException {
        String update = "UPDATE inscripto set id_categoria = "+ (ca.getCategoria().getId()<0?"null":ca.getCategoria().getId())+
                " WHERE id_corredor="+ca.getCorredor().getId()
                + " AND id_auto="+ca.getAuto().getId()
                + " AND id_torneo="+t.getId();
        db.executeUpdate(update);
    }

    public CatCorredorAuto getInscriptos(Torneo t) throws SQLException{
        CatCorredorAuto cats = new CatCorredorAuto();
        //una lista de auto-corredor con su tiempo minimo (decisivo)
        String query="select ca.id_auto, a.patente, "
                + " ca.id_corredor,c.nombre,c.apellido, c.dni,"
                + " numero_designado numero,"
                + " categ.id id_categoria,categ.descripcion desc_categ, categ.tiempo_maximo "
                + " from  inscripto cc"
                + " inner join auto a on cc.id_auto = a.id"
                + " inner join corredor c on cc.id_corredor = c.id"
                + " inner join corredor_auto ca on ca.id_auto=cc.id_auto and ca.id_corredor=cc.id_corredor"
                + " inner join categoria categ on categ.id=cc.id_categoria"
                + " WHERE cc.id_torneo = "+t.getId();
        ResultSet rs = db.getResultSet(query);
        while(rs.next()){
            carreras.entidades.Auto a = new carreras.entidades.Auto(rs.getInt("id_auto"), rs.getString("patente"));
            carreras.entidades.Corredor c = new carreras.entidades.Corredor(rs.getInt("id_corredor"), rs.getString("nombre"), rs.getString("apellido"), rs.getInt("dni"));
            carreras.entidades.Categoria categ = new carreras.entidades.Categoria(rs.getInt("id_categoria"),rs.getString("desc_categ"),rs.getFloat("tiempo_maximo"));
            carreras.entidades.CorredorAuto ca = new CorredorAuto(rs.getInt("numero"), a, c, categ);
            cats.add(ca);
        }
        
        
        return cats;
    }
    //FIXME: incoherencia de lo que se quiere hacer y lo que se hace (??)
    public void actualizaCategoriaInscriptos(Torneo t) throws SQLException{
            //una lista de auto-corredor con su tiempo minimo (decisivo)
        //AGAIN by fanky10 on 2011-11-25
        String dtt_tiempos = "DROP TEMPORARY TABLE IF EXISTS tt_tiempos";
        String ctt_tiempos = "CREATE TEMPORARY TABLE tt_tiempos("
                + "select ins.id id_inscripto, ca.id_auto, a.patente,  ca.id_corredor,c.nombre,c.apellido, c.dni, numero_designado numero,min(tiempo) tcateg"
                + " from  carril_carrera cc"
                + " inner join corredor_auto ca on ca.id_auto=cc.id_auto and ca.id_corredor=cc.id_corredor"
                + " inner join carrera car on cc.id_carrera = car.id inner"
                + " join auto a on cc.id_auto = a.id"
                + " inner join corredor c on cc.id_auto = a.id"
                + " inner join tipo_tiempo tt on cc.tipo_tiempo=tt.id"
                + " inner join competencia comp on car.id_competencia = comp.id inner join inscripto ins on ins.id_auto=cc.id_auto and ins.id_corredor = cc.id_corredor and ins.id_torneo=comp.id_torneo"
                + " WHERE comp.id_torneo = "+t.getId()+" and tt.decisorio = 1"
                + " group by ca.id_auto,ca.id_corredor"
                + " );";
        String dtt_upd_inscriptos ="DROP TEMPORARY TABLE IF EXISTS tt_upd_ins;";
        String ctt_upd_inscriptos ="CREATE TEMPORARY TABLE tt_upd_ins("
                +" select * from ("
                +" select tst.id_inscripto, c.id id_categoria,(tst.tcateg>= c.tiempo_maximo or tst.tcateg between c.tiempo_minimo and c.tiempo_maximo ) bool "
                //creo una temp table con el min y el max (:
                +" from (select c1.id, (case when c2.tiempo_maximo is null then 0 else c2.tiempo_maximo end) tiempo_minimo, c1.tiempo_maximo from categoria c1 left join categoria c2 on c1.id = c2.id-1) c"
                +" join tt_tiempos tst  order by tcateg,tiempo_maximo desc"
                +" ) ts where bool=1 group by ts.id_inscripto"
                +");";
        //finalmente el update posta
        String update = "update inscripto i inner join tt_upd_ins c on c.id_inscripto=i.id set i.id_categoria = c.id_categoria;";
//        //luego los agrupo y le asigno su categoria.
//        String dtt_categ = "DROP TEMPORARY TABLE IF EXISTS tt_categ";
//        String ctt_categ ="create temporary table tt_categ("
//                + " select tt.*, c.id id_categoria,c.descripcion desc_categ, c.tiempo_maximo"
//                + " from tt_tiempos tt"
//                + " inner join categoria c on c.tiempo_maximo<=tt.tcateg"
//                + " order by tiempo_maximo desc);";
//        //no tiene sentido que se haga un update por algo que no sea su PK
//        String update = "update inscripto i inner join (select * from tt_categ group by id_auto,id_corredor) c"
//                + " on c.id_auto=i.id_auto and c.id_corredor=i.id_corredor set i.id_categoria = c.id_categoria";
        try{
            db.startTransaction();
            
            db.executeUpdate(dtt_tiempos);
            db.executeUpdate(ctt_tiempos);
            
            db.executeUpdate(dtt_upd_inscriptos);
            db.executeUpdate(ctt_upd_inscriptos);
            
            db.executeUpdate(update);
            
            db.commitTransaction();
        }catch(SQLException ex){
            db.rollbackTransaction();
            System.err.println("operation rollbacked successfully, check log!");
            throw ex;
            
        }
    }
}
